Attaching package: ‘googledrive’
The following objects are masked from ‘package:googlesheets4’:
request_generate, request_make
Registered S3 methods overwritten by 'dbplyr':
method from
print.tbl_lazy
print.tbl_sql
── Attaching packages ──────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✓ ggplot2 3.3.5 ✓ purrr 0.3.4
✓ tibble 3.1.5 ✓ dplyr 1.0.7
✓ tidyr 1.1.4 ✓ stringr 1.4.0
✓ readr 2.0.2 ✓ forcats 0.5.1
── Conflicts ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag() masks stats::lag()
x googledrive::request_generate() masks googlesheets4::request_generate()
x googledrive::request_make() masks googlesheets4::request_make()
Attaching package: ‘igraph’
The following objects are masked from ‘package:dplyr’:
as_data_frame, groups, union
The following objects are masked from ‘package:purrr’:
compose, simplify
The following object is masked from ‘package:tidyr’:
crossing
The following object is masked from ‘package:tibble’:
as_data_frame
The following objects are masked from ‘package:stats’:
decompose, spectrum
The following object is masked from ‘package:base’:
union
Attaching package: ‘kableExtra’
The following object is masked from ‘package:dplyr’:
group_rows
Registered S3 method overwritten by 'data.table':
method from
print.data.table
Attaching package: ‘flextable’
The following objects are masked from ‘package:kableExtra’:
as_image, footnote
The following object is masked from ‘package:igraph’:
compose
The following object is masked from ‘package:purrr’:
compose
GEO Working Group:
Data Working Group
(Data-WG)
Subgroup:
Data Sharing and Data Management
Principles (Data-WG/DSDMP). In particular, the following subgroup
members provided invaluable input into the development of the approach
used in the development of this analysis: Bente Lija Bye, Eugenio
Trumpy, Chris Jarvis, Jose Miguel Rubio Iglesias, Ethan McMahon, Robert
R Downs, Chris Shubert, Sebastian Claus, Paula De Salvo
This document summmarizes the process and outputs of an analytic
approach taken to increase the Data-WG and broader GEO community
understanding of the relationship between the GEO Data
Sharing (pg 11) and Data
Management Principles (pg. 10) (referred to as DSDMP
hereafter) and other data lifecycle models and reference principles
(referred to as reference frameworks hereafter) that have been
developed since the development of the GEO principles as part of the 2016-2025
GEO Strategic Plan. This document presents both a narrative
description of the process followed in developing the initial
connections between the DSDMP and reference frameworks, and summary
visualizations of the preliminary data.
The work presented herein was initiated in July 2021 within the
Data-WG/DSDMP through a discussion within the subgroup to identify an
initial set of reference frameworks to focus on in the identification of
connections between the DSDMP and those reference frameworks. The
identification of these connections was intended to serve three
purposes:
- Identify gaps in the coverage by DSDMP concepts of elements of the
reference frameworks
- Inform discussions for further development of the DSDMP with
specific insights gained from the process of gap identification
- Enable enhanced communication of the DSDMP to audiences familiar
with the reference frameworks through communication of the identified
connections between the frameworks with which they are familiar and the
DSDMP.
Reference lifecycles and principles were included in the analysis to
both address questions of how the DSDMP relate to the process steps
emphasized in lifecycle models, and the more conceptual elements of the
reference principles. Through addressing both reference lifecycles and
principles we can gain a more holistic assessment of the current
relationship between the DSDMP and the community’s broader practice
informed by values. The initial set of lifecycles and principles
identified by the Data-WG/DSDMP included:
Data Collection
Following the identifcation of the reference frameworks to be used in
the analysis a shared Google
spreadsheet was developed in which the preliminary mappings between
the DSDMP and each of the reference frameworks. The use of the
spreadsheet allowed for rapid prototyping of the data model for
capturing and organizing the developed mappings. The spreadsheet
includes an Instructions worksheet that provides background
information about the content and structure of the spreadsheet, a
Lifecycles worksheet that provides reference information
and labels for each of the selected reference frameworks, a
Crosswalk-DataSharingPrinciples worksheet that provides
reference information about the individual GEO data sharing principles
and the mapping between those principles and the reference frameworks,
and a Crosswalk-DataManagementPrinciples worksheet that
provides reference information about the GEO data management principles
and the mapping between those principles and the reference
frameworks.
The tabular structure within the prototype spreadsheet enables
streamlined extraction of content of descriptive information about the
individual DSDMT and reference frameworks and the identified connections
between them.
Analysis
The extraction of data managed in the prototype spreadsheet is
accomplished through R code (in the form of the R markdown document used
to create this document and other analytic products) that:
- Reads the content of the individual data containing worksheets
Lifecycles
Crosswalk-DataSharingPrinciples
Crosswalk-DataManagementPrinciples
- Extracts and formats the data from each worksheet
- Presents the extracted connection information in tabular form
- Visualizes the connection information for graphic
interpretation
- Presents the reference information about the DSDMP and reference
frameworks
Visualization of DSDMP Relationships with Reference Lifecycles and
Principles
GEO Data Management Principles Mapped to DataONE Lifecycle
Elements
Using `sugiyama` as default layout
GEO Data Management Principles Mapped to NSTC Lifecycle Elements
Multiple parents. Unfolding graph
Multiple roots in graph. Choosing the first
Using `tree` as default layout
GEO Data Management
Principles Mapped to EEA Lifecycle Elements
Multiple parents. Unfolding graph
Multiple roots in graph. Choosing the first
Multiple parents. Unfolding graph
Multiple roots in graph. Choosing the first
Using `tree` as default layout
GEO Data Management
Principles Mapped to NIST Lifecycle Elements
Using `sugiyama` as default layout
GEO Data Management
Principles Mapped to FAIR Principles Elements
Using `sugiyama` as default layout
GEO Data Management
Principles Mapped to TRUST Principles Elements
Using `sugiyama` as default layout
Crosswalk of GEO, FAIR, and TRUST principles
Next Steps
While the current spreadsheet provides a useful initial platform for
capturing and sharing the initial mappings, it does not provide a
scalable data structure that will enable streamlined collection of data
from multiple contributors, allowing for cross-validation of identified
connections. Next steps for work on this project include the
following:
- Transitioning to a data model that will enable capture and
management of connection information from multiple contributors -
enabling cross validation of identified connections.
- Expansion of the data model to capture information about the nature
of the connections
- Develop an online dashboard that provides current connection
information based upon community contributed data
- Publish the results of the analysis in one or more Earth Science
data publication venues
Appendix A - Reference Information for the Data Sharing and Data
Management Principles
LS0tCnRpdGxlOiAiTGlua2luZyB0aGUgR0VPIERhdGEgU2hhcmluZyBhbmQgRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgdG8gb3RoZXIgUmVmZXJlbmNlIExpZmVjeWNsZXMgYW5kIFByaW5jaXBsZXMiCmF1dGhvcjogIkthcmwgQmVuZWRpY3QgLSBVbml2ZXJzaXR5IG9mIE5ldyBNZXhpY28gLyBFYXJ0aCBTY2llbmNlIEluZm9ybWF0aW9uIFBhcnRuZXJzIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclWS0lYi0lZCcpYCIKb3V0cHV0OgogIHBkZl9kb2N1bWVudDogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAp1cmxjb2xvcjogYmx1ZQpoZWFkZXItaW5jbHVkZXM6Ci0gXHVzZXBhY2thZ2V7Y2FwdGlvbn0KLSBcY2FwdGlvbnNldHVwW2ZpZ3VyZV17bGFiZWxmb3JtYXQ9ZW1wdHl9Ci0tLQoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgbG9hZCByZXF1aXJlZCBsaWJyYXJpZXMKbGlicmFyeShnb29nbGVzaGVldHM0KQpsaWJyYXJ5KGdvb2dsZWRyaXZlKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShpZ3JhcGgpCmxpYnJhcnkoZ2dyYXBoKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZmxleHRhYmxlKQoKb3B0cyA8LSBvcHRpb25zKGtuaXRyLmthYmxlLk5BID0gIiIpCmBgYAoKfCAqKkdFTyBXb3JraW5nIEdyb3VwKio6IFtEYXRhIFdvcmtpbmcgR3JvdXAgKERhdGEtV0cpXShodHRwczovL3d3dy5lYXJ0aG9ic2VydmF0aW9ucy5vcmcvZGF0YV93Zy5waHApCnwgKipTdWJncm91cCoqOiAqRGF0YSBTaGFyaW5nIGFuZCBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyogKERhdGEtV0cvRFNETVApLiBJbiBwYXJ0aWN1bGFyLCB0aGUgZm9sbG93aW5nIHN1Ymdyb3VwIG1lbWJlcnMgcHJvdmlkZWQgaW52YWx1YWJsZSBpbnB1dCBpbnRvIHRoZSBkZXZlbG9wbWVudCBvZiB0aGUgYXBwcm9hY2ggdXNlZCBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBhbmFseXNpczogQmVudGUgTGlqYSBCeWUsIEV1Z2VuaW8gVHJ1bXB5LCBDaHJpcyBKYXJ2aXMsIEpvc2UgTWlndWVsIFJ1YmlvIElnbGVzaWFzLCBFdGhhbiBNY01haG9uLCBSb2JlcnQgUiBEb3ducywgQ2hyaXMgU2h1YmVydCwgU2ViYXN0aWFuIENsYXVzLCBQYXVsYSBEZSBTYWx2bwoKCgpUaGlzIGRvY3VtZW50IHN1bW1tYXJpemVzIHRoZSBwcm9jZXNzIGFuZCBvdXRwdXRzIG9mIGFuIGFuYWx5dGljIGFwcHJvYWNoIHRha2VuIHRvIGluY3JlYXNlIHRoZSBEYXRhLVdHIGFuZCBicm9hZGVyIEdFTyBjb21tdW5pdHkgdW5kZXJzdGFuZGluZyBvZiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIEdFTyBbRGF0YSBTaGFyaW5nIChwZyAxMSldKGh0dHBzOi8vd3d3LmVhcnRob2JzZXJ2YXRpb25zLm9yZy9kb2N1bWVudHMvb3Blbl9lb19kYXRhL0dFT19TdHJhdGVnaWNfUGxhbl8yMDE2XzIwMjVfSW1wbGVtZW50aW5nX0dFT1NTX1JlZmVyZW5jZV9Eb2N1bWVudC5wZGYpIGFuZCBbRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgKHBnLiAxMCldKGh0dHBzOi8vd3d3LmVhcnRob2JzZXJ2YXRpb25zLm9yZy9kb2N1bWVudHMvb3Blbl9lb19kYXRhL0dFT19TdHJhdGVnaWNfUGxhbl8yMDE2XzIwMjVfSW1wbGVtZW50aW5nX0dFT1NTX1JlZmVyZW5jZV9Eb2N1bWVudC5wZGYpIChyZWZlcnJlZCB0byBhcyAqRFNETVAqIGhlcmVhZnRlcikgYW5kIG90aGVyIGRhdGEgbGlmZWN5Y2xlIG1vZGVscyBhbmQgcmVmZXJlbmNlIHByaW5jaXBsZXMgKHJlZmVycmVkIHRvIGFzICpyZWZlcmVuY2UgZnJhbWV3b3JrcyogaGVyZWFmdGVyKSB0aGF0IGhhdmUgYmVlbiBkZXZlbG9wZWQgc2luY2UgdGhlIGRldmVsb3BtZW50IG9mIHRoZSBHRU8gcHJpbmNpcGxlcyBhcyBwYXJ0IG9mIHRoZSBbMjAxNi0yMDI1IEdFTyBTdHJhdGVnaWMgUGxhbl0oaHR0cHM6Ly93d3cuZWFydGhvYnNlcnZhdGlvbnMub3JnL2RvY3VtZW50cy9vcGVuX2VvX2RhdGEvR0VPX1N0cmF0ZWdpY19QbGFuXzIwMTZfMjAyNV9JbXBsZW1lbnRpbmdfR0VPU1MucGRmKS4gVGhpcyBkb2N1bWVudCBwcmVzZW50cyBib3RoIGEgbmFycmF0aXZlIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9jZXNzIGZvbGxvd2VkIGluIGRldmVsb3BpbmcgdGhlIGluaXRpYWwgY29ubmVjdGlvbnMgYmV0d2VlbiB0aGUgRFNETVAgYW5kIHJlZmVyZW5jZSBmcmFtZXdvcmtzLCBhbmQgc3VtbWFyeSB2aXN1YWxpemF0aW9ucyBvZiB0aGUgcHJlbGltaW5hcnkgZGF0YS4gCgpUaGUgd29yayBwcmVzZW50ZWQgaGVyZWluIHdhcyBpbml0aWF0ZWQgaW4gSnVseSAyMDIxIHdpdGhpbiB0aGUgRGF0YS1XRy9EU0RNUCB0aHJvdWdoIGEgZGlzY3Vzc2lvbiB3aXRoaW4gdGhlIHN1Ymdyb3VwIHRvIGlkZW50aWZ5IGFuIGluaXRpYWwgc2V0IG9mIHJlZmVyZW5jZSBmcmFtZXdvcmtzIHRvIGZvY3VzIG9uIGluIHRoZSBpZGVudGlmaWNhdGlvbiBvZiBjb25uZWN0aW9ucyBiZXR3ZWVuIHRoZSBEU0RNUCBhbmQgdGhvc2UgcmVmZXJlbmNlIGZyYW1ld29ya3MuIFRoZSBpZGVudGlmaWNhdGlvbiBvZiB0aGVzZSBjb25uZWN0aW9ucyB3YXMgaW50ZW5kZWQgdG8gc2VydmUgdGhyZWUgcHVycG9zZXM6CgoqIElkZW50aWZ5IGdhcHMgaW4gdGhlIGNvdmVyYWdlIGJ5IERTRE1QIGNvbmNlcHRzIG9mIGVsZW1lbnRzIG9mIHRoZSByZWZlcmVuY2UgZnJhbWV3b3JrcwoqIEluZm9ybSBkaXNjdXNzaW9ucyBmb3IgZnVydGhlciBkZXZlbG9wbWVudCBvZiB0aGUgRFNETVAgd2l0aCBzcGVjaWZpYyBpbnNpZ2h0cyBnYWluZWQgZnJvbSB0aGUgcHJvY2VzcyBvZiBnYXAgaWRlbnRpZmljYXRpb24KKiBFbmFibGUgZW5oYW5jZWQgY29tbXVuaWNhdGlvbiBvZiB0aGUgRFNETVAgdG8gYXVkaWVuY2VzIGZhbWlsaWFyIHdpdGggdGhlIHJlZmVyZW5jZSBmcmFtZXdvcmtzIHRocm91Z2ggY29tbXVuaWNhdGlvbiBvZiB0aGUgaWRlbnRpZmllZCBjb25uZWN0aW9ucyBiZXR3ZWVuIHRoZSBmcmFtZXdvcmtzIHdpdGggd2hpY2ggdGhleSBhcmUgZmFtaWxpYXIgYW5kIHRoZSBEU0RNUC4gCgpSZWZlcmVuY2UgbGlmZWN5Y2xlcyBhbmQgcHJpbmNpcGxlcyB3ZXJlIGluY2x1ZGVkIGluIHRoZSBhbmFseXNpcyB0byBib3RoIGFkZHJlc3MgcXVlc3Rpb25zIG9mIGhvdyB0aGUgRFNETVAgcmVsYXRlIHRvIHRoZSBwcm9jZXNzIHN0ZXBzIGVtcGhhc2l6ZWQgaW4gbGlmZWN5Y2xlIG1vZGVscywgYW5kIHRoZSBtb3JlIGNvbmNlcHR1YWwgZWxlbWVudHMgb2YgdGhlIHJlZmVyZW5jZSBwcmluY2lwbGVzLiBUaHJvdWdoIGFkZHJlc3NpbmcgYm90aCByZWZlcmVuY2UgbGlmZWN5Y2xlcyBhbmQgcHJpbmNpcGxlcyB3ZSBjYW4gZ2FpbiBhIG1vcmUgaG9saXN0aWMgYXNzZXNzbWVudCBvZiB0aGUgY3VycmVudCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgRFNETVAgYW5kIHRoZSBjb21tdW5pdHkncyBicm9hZGVyIHByYWN0aWNlIGluZm9ybWVkIGJ5IHZhbHVlcy4gVGhlIGluaXRpYWwgc2V0IG9mIGxpZmVjeWNsZXMgYW5kIHByaW5jaXBsZXMgaWRlbnRpZmllZCBieSB0aGUgRGF0YS1XRy9EU0RNUCBpbmNsdWRlZDoKCiogW05PQUEgRW52aXJvbm1lbnRhbCBEYXRhIE1hbmFnZW1lbnQgRnJhbWV3b3JrXShodHRwczovL25vc2Mubm9hYS5nb3YvRURNQy9mcmFtZXdvcmsucGhwKSAoRURNRiAtIG5vdCB5ZXQgY29tcGxldGVkKQoqIFtVUyBOYXRpb25hbCBTY2llbmNlIGFuZCBUZWNobm9sb2d5IENvdW5jaWwgQ29tbW9uIEZyYW1ld29yayBmb3IgRU8gRGF0YV0oaHR0cHM6Ly91c2dlby5nb3YvdXBsb2Fkcy9jb21tb25fZnJhbWV3b3JrX2Zvcl9lYXJ0aF9vYnNlcnZhdGlvbl9kYXRhLnBkZikgKE5TVEMgLSBwcmVsaW1pbmFyeSBjb25uZWN0aW9ucyBkZWZpbmVkKQoqIFtFdXJvcGVhbiBFbnZpcm9ubWVudCBBZ2VuY3kgRGF0YS9JbmZvcm1hdGlvbiBNYW5hZ2VtZW50IEZyYW1ld29ya10oaHR0cHM6Ly9lbmktc2Vpcy5laW9uZXQuZXVyb3BhLmV1L2Vhc3QvZ292ZXJuYW5jZS9wcm9qZWN0LWRvY3VtZW50cy9lZWEtZGF0YS1pbmZvcm1hdGlvbi1tYW5hZ2VtZW50LWZyYW1ld29yaykKIChFRUEgLSBwcmVsaW1pbmFyeSBjb25uZWN0aW9ucyBkZWZpbmVkKQogKiBbKFVTKSBOYXRpb25hbCBJbnN0aXR1dGUgZm9yIFN0YW5kYXJkcyBhbmQgVGVjaG5vbG9neSBSZXNlYXJjaCBEYXRhIEZyYW1ld29ya10oaHR0cHM6Ly93d3cubmlzdC5nb3Yvc3lzdGVtL2ZpbGVzL2RvY3VtZW50cy8yMDIxLzAxLzI5L1JEYUYlMjBPdmVydmV3JTIwSGFuaXNjaC5wZGYpIChOSVNUIC0gcHJlbGltaW5hcnkgY29ubmVjdGlvbnMgZGVmaW5lZCkKICogW0RhdGFPTkUgRGF0YSBMaWZlY3ljbGVdKGh0dHBzOi8vb2xkLmRhdGFvbmUub3JnL2RhdGEtbGlmZS1jeWNsZSkgKERhdGFPTkUgLSBwcmVsaW1pbmFyeSBjb25uZWN0aW9ucyBkZWZpbmVkKQogKiBbRkFJUiBQcmluY2lwbGVzXShodHRwczovL3d3dy5uYXR1cmUuY29tL2FydGljbGVzL3NkYXRhMjAxNjE4KSAoRkFJUiAtIHByZWxpbWluYXJ5IGNvbm5lY3Rpb25zIGRlZmluZWQpCiAqIFtUUlVTVCBQcmluY2lwbGVzXShodHRwczovL3d3dy5uYXR1cmUuY29tL2FydGljbGVzL3M0MTU5Ny0wMjAtMDQ4Ni03KSAoVFJVU1QgLSBwcmVsaW1pbmFyeSBjb25uZWN0aW9ucyBkZWZpbmVkKQogKiBDQVJFIFByaW5jaXBsZXMgKENBUkUgLSBub3QgeWV0IGNvbXBsZXRlZCkKCgojIyBEYXRhIENvbGxlY3Rpb24KCkZvbGxvd2luZyB0aGUgaWRlbnRpZmNhdGlvbiBvZiB0aGUgcmVmZXJlbmNlIGZyYW1ld29ya3MgdG8gYmUgdXNlZCBpbiB0aGUgYW5hbHlzaXMgYSBzaGFyZWQgW0dvb2dsZSBzcHJlYWRzaGVldF0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMTVGbXcwbTJqeC13S05xeXpCOUFzUmJEZW9rcDlOb3dyWkJkN1hMSFpURWMvZWRpdCNnaWQ9MTcxOTk0OTY0MSkgd2FzIGRldmVsb3BlZCBpbiB3aGljaCB0aGUgcHJlbGltaW5hcnkgbWFwcGluZ3MgYmV0d2VlbiB0aGUgRFNETVAgYW5kIGVhY2ggb2YgdGhlIHJlZmVyZW5jZSBmcmFtZXdvcmtzLiBUaGUgdXNlIG9mIHRoZSBzcHJlYWRzaGVldCBhbGxvd2VkIGZvciByYXBpZCBwcm90b3R5cGluZyBvZiB0aGUgZGF0YSBtb2RlbCBmb3IgY2FwdHVyaW5nIGFuZCBvcmdhbml6aW5nIHRoZSBkZXZlbG9wZWQgbWFwcGluZ3MuIFRoZSBzcHJlYWRzaGVldCBpbmNsdWRlcyBhbiBgSW5zdHJ1Y3Rpb25zYCB3b3Jrc2hlZXQgdGhhdCBwcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250ZW50IGFuZCBzdHJ1Y3R1cmUgb2YgdGhlIHNwcmVhZHNoZWV0LCBhIGBMaWZlY3ljbGVzYCB3b3Jrc2hlZXQgdGhhdCBwcm92aWRlcyByZWZlcmVuY2UgaW5mb3JtYXRpb24gYW5kIGxhYmVscyBmb3IgZWFjaCBvZiB0aGUgc2VsZWN0ZWQgcmVmZXJlbmNlIGZyYW1ld29ya3MsIGEgYENyb3Nzd2Fsay1EYXRhU2hhcmluZ1ByaW5jaXBsZXNgIHdvcmtzaGVldCB0aGF0IHByb3ZpZGVzIHJlZmVyZW5jZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5kaXZpZHVhbCBHRU8gZGF0YSBzaGFyaW5nIHByaW5jaXBsZXMgYW5kIHRoZSBtYXBwaW5nIGJldHdlZW4gdGhvc2UgcHJpbmNpcGxlcyBhbmQgdGhlIHJlZmVyZW5jZSBmcmFtZXdvcmtzLCBhbmQgYSBgQ3Jvc3N3YWxrLURhdGFNYW5hZ2VtZW50UHJpbmNpcGxlc2Agd29ya3NoZWV0IHRoYXQgcHJvdmlkZXMgcmVmZXJlbmNlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBHRU8gZGF0YSBtYW5hZ2VtZW50IHByaW5jaXBsZXMgYW5kIHRoZSBtYXBwaW5nIGJldHdlZW4gdGhvc2UgcHJpbmNpcGxlcyBhbmQgdGhlIHJlZmVyZW5jZSBmcmFtZXdvcmtzLiAKClRoZSB0YWJ1bGFyIHN0cnVjdHVyZSB3aXRoaW4gdGhlIHByb3RvdHlwZSBzcHJlYWRzaGVldCBlbmFibGVzIHN0cmVhbWxpbmVkIGV4dHJhY3Rpb24gb2YgY29udGVudCBvZiBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5kaXZpZHVhbCBEU0RNVCBhbmQgcmVmZXJlbmNlIGZyYW1ld29ya3MgYW5kIHRoZSBpZGVudGlmaWVkIGNvbm5lY3Rpb25zIGJldHdlZW4gdGhlbS4gCgojIyBBbmFseXNpcwoKVGhlIGV4dHJhY3Rpb24gb2YgZGF0YSBtYW5hZ2VkIGluIHRoZSBwcm90b3R5cGUgc3ByZWFkc2hlZXQgaXMgYWNjb21wbGlzaGVkIHRocm91Z2ggUiBjb2RlIChpbiB0aGUgZm9ybSBvZiB0aGUgUiBtYXJrZG93biBkb2N1bWVudCB1c2VkIHRvIGNyZWF0ZSB0aGlzIGRvY3VtZW50IGFuZCBvdGhlciBhbmFseXRpYyBwcm9kdWN0cykgdGhhdDoKCiogUmVhZHMgdGhlIGNvbnRlbnQgb2YgdGhlIGluZGl2aWR1YWwgZGF0YSBjb250YWluaW5nIHdvcmtzaGVldHMKICAqIGBMaWZlY3ljbGVzYAogICogYENyb3Nzd2Fsay1EYXRhU2hhcmluZ1ByaW5jaXBsZXNgCiAgKiBgQ3Jvc3N3YWxrLURhdGFNYW5hZ2VtZW50UHJpbmNpcGxlc2AKKiBFeHRyYWN0cyBhbmQgZm9ybWF0cyB0aGUgZGF0YSBmcm9tIGVhY2ggd29ya3NoZWV0CiogUHJlc2VudHMgdGhlIGV4dHJhY3RlZCBjb25uZWN0aW9uIGluZm9ybWF0aW9uIGluIHRhYnVsYXIgZm9ybQoqIFZpc3VhbGl6ZXMgdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gZm9yIGdyYXBoaWMgaW50ZXJwcmV0YXRpb24KKiBQcmVzZW50cyB0aGUgcmVmZXJlbmNlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBEU0RNUCBhbmQgcmVmZXJlbmNlIGZyYW1ld29ya3MKCgpgYGB7ciwgZWNobz1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0iaGlkZSJ9CiMgQ3Jvc3N3YWxrIGJldHdlZW4gR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIGFuZCBzZWxlY3RlZCBsaWZlY3ljbGVzIGFuZCBwcmluY2lwbGVzCmdzaGVldFVSTCA8LSAiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMTVGbXcwbTJqeC13S05xeXpCOUFzUmJEZW9rcDlOb3dyWkJkN1hMSFpURWMvZWRpdCNnaWQ9MTcxOTk0OTY0MSIKZ3NoZWV0U2hhcmluZ1dvcmtzaGVldCA8LSAiQ3Jvc3N3YWxrLURhdGFTaGFyaW5nUHJpbmNpcGxlcyIKZ3NoZWV0TWFuYWdlbWVudFdvcmtzaGVldCA8LSAiQ3Jvc3N3YWxrLURhdGFNYW5hZ2VtZW50UHJpbmNpcGxlcyIKCmdzNF9kZWF1dGgoKSAjIGRpc2FibGUgYXV0aGVudGljYXRpb24gcmVxdWlyZW1lbnRzIGZvciB0aGlzIHB1YmxpYyBzaGVldAoKIyBnZXQgdGhlIHNoZWV0IGlkcyBmcm9tIHRoZSBnb29nbGUgc2hlZXQgdXJsCnNzaWQgPC0gYXNfc2hlZXRzX2lkKGdzaGVldFVSTCkKdW5jbGFzcyhzc2lkKQoKIyByZXRyaWV2ZSB0aGUgYmFzZSBzaGVldCBjb250ZW50CmxpZmVjeWNsZXMgPC0gcmVhZF9zaGVldChzc2lkLCBzaGVldCA9ICJMaWZlY3ljbGVzIiwgc2tpcCA9IDEsIG5hID0gYygiLSIsICIiKSkKZG1wX2Nyb3Nzd2FsayA8LSByZWFkX3NoZWV0KHNzaWQsIHNoZWV0ID0gIkNyb3Nzd2Fsay1EYXRhTWFuYWdlbWVudFByaW5jaXBsZXMiKQpkc3BfY3Jvc3N3YWxrIDwtIHJlYWRfc2hlZXQoc3NpZCwgc2hlZXQgPSAiQ3Jvc3N3YWxrLURhdGFTaGFyaW5nUHJpbmNpcGxlcyIpCgojIGV4dHJhY3Qgbm9kZXMgCm5fbGlmZWN5Y2xlcyA8LSBsaWZlY3ljbGVzICU+JSAKICBzZWxlY3QobWF0Y2hlcygiLWNvbWJvJCIpKSAlPiUgCiAgZ2F0aGVyKCkgJT4lIAogIGZpbHRlcighaXMubmEodmFsdWUpKSAlPiUgCiAgZGlzdGluY3QodmFsdWUpICU+JSAKICBtdXRhdGUobGFiZWwgPSBzdHJfc3BsaXQodmFsdWUsICItIiwgc2ltcGxpZnkgPSBGQUxTRSwgbiA9IDMpKSAlPiUgCiAgc2VsZWN0KGxhYmVsKQoKbl9kbXAgPC0gZG1wX2Nyb3Nzd2FsayAlPiUgCiAgZmlsdGVyKCFpcy5uYShEYXRhTWFuYWdlbWVudFByaW5jaXBsZSkpICU+JSAKICBkaXN0aW5jdChEYXRhTWFuYWdlbWVudFByaW5jaXBsZSkgJT4lIAogIG11dGF0ZShsYWJlbCA9IERhdGFNYW5hZ2VtZW50UHJpbmNpcGxlKSAlPiUgCiAgc2VsZWN0KGxhYmVsKQoKbl9hbGwgPC0gbl9saWZlY3ljbGVzICU+JSAKICByb3d3aXNlKCkgJT4lIAogIG11dGF0ZSh0eXBlID0gY2FzZV93aGVuKGxhYmVsWzFdID09ICJUUlVTVCIgfiAicHJpbmNpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFsxXSA9PSAiRkFJUiIgfiAicHJpbmNpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFsxXSA9PSAiRGF0YU9ORSIgfiAibGlmZWN5Y2xlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFsxXSA9PSAiTklTVCIgfiAibGlmZWN5Y2xlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFsxXSA9PSAiRUVBIiB+ICJsaWZlY3ljbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsWzFdID09ICJEYXRhT05FIiB+ICJsaWZlY3ljbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsWzFdID09ICJOU1RDIiB+ICJsaWZlY3ljbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsWzFdID09ICJEYXRhT05FIiB+ICJsaWZlY3ljbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsWzFdID09ICJFRE1GIiB+ICJsaWZlY3ljbGUiKSkgJT4lIAogIG11dGF0ZSgKICAgIGtleSA9IHBhc3RlKGxhYmVsWzFdLCBsYWJlbFsyXSwgc2VwID0gIi0iKSwgCiAgICBzb3VyY2UgPSBsYWJlbFsxXSwKICAgIHNob3J0X2xhYmVsID0ga2V5LCAKICAgIGxhYmVsID0gcGFzdGUocGFzdGUobGFiZWxbMV0sIGxhYmVsWzJdLCBzZXAgPSAiLSIpLCBsYWJlbFszXSwgc2VwID0gIjogIiksCiAgICBub2RlX2xhYmVsID0gbGFiZWwpICU+JSAKICByYmluZChtdXRhdGUobl9kbXAsCiAgICAgICAgICAgICAgIGtleSA9IHNhcHBseShzdHJzcGxpdChsYWJlbCwgIjoiKSwgIltbIiwgMSksCiAgICAgICAgICAgICAgIHNob3J0X2xhYmVsID0ga2V5LCAKICAgICAgICAgICAgICAgbm9kZV9sYWJlbCA9IGxhYmVsLCAKICAgICAgICAgICAgICAgdHlwZSA9ICJHRU8tUHJpbmNpcGxlIiwKICAgICAgICAgICAgICAgc291cmNlID0gIkdFTyIpKSAlPiUgCiAgc2VsZWN0KGtleSwgc2hvcnRfbGFiZWwsIG5vZGVfbGFiZWwsIHNvdXJjZSwgdHlwZSkKICAKCmVfZG1wX2xpZmVjeWNsZSA8LSB0aWJibGUoImZyb20iID0gY2hhcmFjdGVyKCksICJ0byIgPSBjaGFyYWN0ZXIoKSkKZG1wX2Zyb20gPC0gZG1wX2Nyb3Nzd2FsayREYXRhTWFuYWdlbWVudFByaW5jaXBsZQpkbXBfdG8gPC0gZG1wX2Nyb3Nzd2FsayAlPiUgc2VsZWN0KC1EYXRhTWFuYWdlbWVudFByaW5jaXBsZSwgLVByaW5jaXBsZURlc2NyaXB0aW9uKQoKZm9yIChpIGluIHNlcV9hbG9uZyhkbXBfdG8pKSB7CiAgb3V0X3RvIDwtIGRtcF90b1tbaV1dCiAgb3V0X2NvbWJpbmVkIDwtIGJpbmRfY29scyhkbXBfZnJvbSwgb3V0X3RvKQogIGVfZG1wX2xpZmVjeWNsZSA8LSByYmluZChlX2RtcF9saWZlY3ljbGUsb3V0X2NvbWJpbmVkKQp9CgplX2RtcF9saWZlY3ljbGUgPC0gZV9kbXBfbGlmZWN5Y2xlICU+JSAKICByZW5hbWUoZnJvbSA9IDEsIHRvID0gMikgJT4lIAogIGZpbHRlcighaXMubmEodG8pKSAlPiUgCiAgbXV0YXRlKGxpZmVjeWNsZSA9IHN0cl9zcGxpdCh0bywgIi0iLCBzaW1wbGlmeSA9IFRSVUUpLAogICAgICAgICBmcm9tID0gc2FwcGx5KHN0cnNwbGl0KGZyb20sICI6IiksICJbWyIsIDEpLCkKCm5fZG1wX2xpZmVjeWNsZSA8LSBlX2RtcF9saWZlY3ljbGUgJT4lIAogIHNlbGVjdChmcm9tLCB0bykgJT4lIAogIGdhdGhlcigpICU+JSAKICBzZWxlY3QodmFsdWUpICU+JSAKICBkaXN0aW5jdCh2YWx1ZSkKCmBgYAoKIyMjIERldmVsb3BlZCBDcm9zc3dhbGsgSW5mb3JtYXRpb24KClRoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgY29ubmVjdGlvbnMgZGVmaW5lZCB0aHVzIGZhciBiZXR3ZWVuIHRoZSBHRU8gRFNETVAgYW5kIHRoZSByZWZlcmVuY2UgZnJhbWV3b3Jrcy4gCgpgYGB7ciwgZWNobz1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KZG1wX2Nyb3Nzd2Fsa1tjKDEsNCw1LDYsNyw4LDkpXSAlPiUgCiAgcWZsZXh0YWJsZSgpICU+JSAKICBzZXRfaGVhZGVyX2xhYmVscygKICAgIHZhbHVlcyA9IGxpc3QoRGF0YU1hbmFnZW1lbnRQcmluY2lwbGUgPSAiRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZSIsCiAgICAgICAgICAgICAgICAgICJMaWZlY3ljbGUtRURNRiIgPSAiRURNRiIsCiAgICAgICAgICAgICAgICAgICJMaWZlY3ljbGUtTlNUQyIgPSAiTlNUQyIsCiAgICAgICAgICAgICAgICAgICJMaWZlY3ljbGUtRUVBIiA9ICJFRUEiLAogICAgICAgICAgICAgICAgICAiTGlmZWN5Y2xlLU5JU1QiID0gIk5JU1QiLAogICAgICAgICAgICAgICAgICAiTGlmZWN5Y2xlLURhdGFPTkUiID0gIkRhdGFPTkUiLAogICAgICAgICAgICAgICAgICAiUHJpbmNpcGxlLUZBSVIiID0gIkZBSVIiLAogICAgICAgICAgICAgICAgICAiUHJpbmNpcGxlLVRSVVNUIiA9ICJUUlVTVCIpKSAlPiUgCiAgZm9udHNpemUoc2l6ZSA9IDcsIHBhcnQgPSAiYm9keSIpICU+JSAKICBmaXRfdG9fd2lkdGgobWF4X3dpZHRoID0gNi41LCB1bml0ID0gImluIikKYGBgClxuZXdwYWdlCiMjIFZpc3VhbGl6YXRpb24gb2YgRFNETVAgUmVsYXRpb25zaGlwcyB3aXRoIFJlZmVyZW5jZSBMaWZlY3ljbGVzIGFuZCBQcmluY2lwbGVzCgpgYGB7ciwgZWNobz1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBjaXJjdWxhciBwbG90IDF4MSBmdW5jaXRvbgpnZW9feF9zaW5nbGUgPC0gZnVuY3Rpb24odGl0bGUsIHRvX25vZGVzLCBvdXRwdXRfZmlsZSkgewogIGVkZ2VzIDwtIGZpbHRlcihlX2RtcF9saWZlY3ljbGUsIGxpZmVjeWNsZVssMV0gPT0gdG9fbm9kZXMpCiAgI3ByaW50KGVkZ2VzKQogIHZlcnRpY2VzIDwtIGZpbHRlcihuX2FsbCwgKHNvdXJjZSA9PSB0b19ub2RlcyB8IHNvdXJjZSA9PSAiR0VPIikpCiAgI3ByaW50KHZlcnRpY2VzKQogIGdyYXBoIDwtIGdyYXBoX2Zyb21fZGF0YV9mcmFtZSgKICAgIGQgPSBlZGdlcywKICAgIHZlcnRpY2VzID0gdmVydGljZXMsCiAgICBkaXJlY3RlZCA9IFRSVUUpCiAgeHkgPC0gbGF5b3V0XyhncmFwaCxpbl9jaXJjbGUoKSkKICBjaXJjdWxhcl9wbG90IDwtIGdncmFwaChncmFwaCwgbGF5b3V0ID0gImxpbmVhciIsIGNpcmN1bGFyID0gVFJVRSkgKwogICAgY29vcmRfZml4ZWQoKSArCiAgICBnZW9tX2VkZ2VfbGluazAod2lkdGggPSAuMSkgKwogICAgZ2VvbV9ub2RlX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3Rvcihzb3VyY2UpKSwgc2l6ZSA9IDEsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICAgIGdlb21fbm9kZV9sYWJlbChhZXMobGFiZWwgPSBzaG9ydF9sYWJlbCwgCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gYXMuZmFjdG9yKHNvdXJjZSkpLCAKICAgICAgICAgICAgICAgICAgICBsYWJlbC5zaXplID0gMCwKICAgICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgICB4bGltKC0xLjEsIDEuMSkgKwogICAgeWxpbSgtMS4xLCAxLjEpICsKICAgICNnZ3RpdGxlKHRpdGxlKSArCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkKICBnZ3NhdmUocGFzdGUoImltYWdlcy9jaXJjdWxhcl8iLCBvdXRwdXRfZmlsZSwgc2VwID0gIiIpLCBwbG90ID0gY2lyY3VsYXJfcGxvdCwgd2lkdGggPSA5LCBoZWlnaHQgPSA5LCBkcGkgPSA2MDApCiAgCiAgIGRlZmF1bHRfcGxvdCA8LSBnZ3JhcGgoZ3JhcGgpICsKICAgIGdlb21fZWRnZV9saW5rMCh3aWR0aCA9IC4xKSArCiAgICBnZW9tX25vZGVfcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHNvdXJjZSkpLCBzaXplID0gMSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogICAgZ2VvbV9ub2RlX2xhYmVsKGFlcyhsYWJlbCA9IHNob3J0X2xhYmVsLCAKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBhcy5mYWN0b3Ioc291cmNlKSksIAogICAgICAgICAgICAgICAgICAgIGxhYmVsLnNpemUgPSAwLAogICAgICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKICAgICNnZ3RpdGxlKHRpdGxlKSArCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSkKICBnZ3NhdmUocGFzdGUoImltYWdlcy9hdXRvXyIsIG91dHB1dF9maWxlLCBzZXAgPSAiIiksIHBsb3QgPSBkZWZhdWx0X3Bsb3QsIHdpZHRoID0xMiwgaGVpZ2h0ID0xMiwgZHBpID0gNjAwKQogIAogICNmaWd1cmVzIDwtIGMocGFzdGUoIi4vaW1hZ2VzL2NpcmN1bGFyXyIsIG91dHB1dF9maWxlLCBzZXAgPSAiIiksIHBhc3RlKCIuL2ltYWdlcy9hdXRvXyIsIG91dHB1dF9maWxlLCBzZXAgPSAiIikpCiAgI3JldHVybihmaWd1cmVzKQp9CmBgYAoKR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIE1hcHBlZCB0byBEYXRhT05FIExpZmVjeWNsZSBFbGVtZW50cwoKYGBge3IsIGVjaG89RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9Cmdlb194X3NpbmdsZSgKICAiR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIE1hcHBlZCB0byBEYXRhT05FIExpZmVjeWNsZSBFbGVtZW50cyIsCiAgIkRhdGFPTkUiLCAKICAiZGF0YW9uZS5wbmciKQpgYGAKCiFbR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gRGF0YU9ORV0oaW1hZ2VzL2NpcmN1bGFyX2RhdGFvbmUucG5nKXt3aWR0aD02aW59CjwhLS0gIVtHRU8gRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgLSBEYXRhT05FXShpbWFnZXMvYXV0b19kYXRhb25lLnBuZykgLS0+ClxuZXdwYWdlCkdFTyBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyBNYXBwZWQgdG8gTlNUQyBMaWZlY3ljbGUgRWxlbWVudHMKCmBgYHtyLCBlY2hvPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpnZW9feF9zaW5nbGUoCiAgIkdFTyBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyBNYXBwZWQgdG8gTlNUQyBMaWZlY3ljbGUgRWxlbWVudHMiLAogICJOU1RDIiwgCiAgIm5zdGMucG5nIikKYGBgCgohW0dFTyBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyAtIE5TVENdKGltYWdlcy9jaXJjdWxhcl9uc3RjLnBuZyl7d2lkdGg9NmlufQpcbmV3cGFnZQpHRU8gRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgTWFwcGVkIHRvIEVFQSBMaWZlY3ljbGUgRWxlbWVudHMKCmBgYHtyLCBlY2hvPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpnZW9feF9zaW5nbGUoCiAgIkdFTyBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyBNYXBwZWQgdG8gRUVBIExpZmVjeWNsZSBFbGVtZW50cyIsCiAgIkVFQSIsIAogICJlZWEucG5nIikKYGBgCgohW0dFTyBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyAtIEVFQV0oaW1hZ2VzL2NpcmN1bGFyX2VlYS5wbmcpe3dpZHRoPTZpbn0KXG5ld3BhZ2UKR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIE1hcHBlZCB0byBOSVNUIExpZmVjeWNsZSBFbGVtZW50cwoKYGBge3IsIGVjaG89RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9Cmdlb194X3NpbmdsZSgKICAiR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIE1hcHBlZCB0byBOSVNUIExpZmVjeWNsZSBFbGVtZW50cyIsCiAgIk5JU1QiLCAKICAibmlzdC5wbmciKQpgYGAKCiFbR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gTklTVF0oaW1hZ2VzL2NpcmN1bGFyX25pc3QucG5nKXt3aWR0aD02aW59ClxuZXdwYWdlCkdFTyBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyBNYXBwZWQgdG8gRkFJUiBQcmluY2lwbGVzIEVsZW1lbnRzCgpgYGB7ciwgZWNobz1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KZ2VvX3hfc2luZ2xlKAogICJHRU8gRGF0YSBNYW5hZ2VtZW50IFByaW5jaXBsZXMgTWFwcGVkIHRvIEZBSVIgUHJpbmNpcGxlcyBFbGVtZW50cyIsCiAgIkZBSVIiLCAKICAiZmFpci5wbmciKQpgYGAKCiFbR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIC0gRkFJUl0oaW1hZ2VzL2NpcmN1bGFyX2ZhaXIucG5nKXt3aWR0aD02aW59ClxuZXdwYWdlCkdFTyBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyBNYXBwZWQgdG8gVFJVU1QgUHJpbmNpcGxlcyBFbGVtZW50cwoKYGBge3IsIGVjaG89RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9Cmdlb194X3NpbmdsZSgKICAiR0VPIERhdGEgTWFuYWdlbWVudCBQcmluY2lwbGVzIE1hcHBlZCB0byBUUlVTVCBQcmluY2lwbGVzIEVsZW1lbnRzIiwKICAiVFJVU1QiLCAKICAidHJ1c3QucG5nIikKYGBgCgohW0dFTyBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcyAtIFRSVVNUXShpbWFnZXMvY2lyY3VsYXJfdHJ1c3QucG5nKXt3aWR0aD02aW59CgpgYGB7ciwgZWNobz1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBjb21iaW5lZCBncmFwaCBmb3IgYWxsIHByaW5jaXBsZXMKZ3JhcGggPC0gZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKAogICAgZCA9IGZpbHRlcihlX2RtcF9saWZlY3ljbGUsIChsaWZlY3ljbGUgPT0gIkZBSVIiIHwgbGlmZWN5Y2xlID09ICJUUlVTVCIpICksCiAgICB2ZXJ0aWNlcyA9IGZpbHRlcihuX2FsbCwgKHNvdXJjZSA9PSAiRkFJUiIgfCBzb3VyY2UgPT0gIlRSVVNUIiB8IHNvdXJjZSA9PSAiR0VPIikgKSwKICAgIGRpcmVjdGVkID0gRkFMU0UpCnh5IDwtIGxheW91dF8oZ3JhcGgsaW5fY2lyY2xlKCkpCm15Z3JhcGggPC0gZ2dyYXBoKGdyYXBoLCBsYXlvdXQgPSAibGluZWFyIiwgY2lyY3VsYXIgPSBUUlVFKSArCiAgICBjb29yZF9maXhlZCgpICsKICAgIGdlb21fZWRnZV9saW5rMChhZXMoY29sb3IgPSBsaWZlY3ljbGUpLCB3aWR0aCA9IC41KSArCiAgICBnZW9tX25vZGVfcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHNvdXJjZSkpLCBzaXplID0gMSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogICAgZ2VvbV9ub2RlX2xhYmVsKGFlcyhsYWJlbCA9IHNob3J0X2xhYmVsLCAKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBhcy5mYWN0b3Ioc291cmNlKSksIAogICAgICAgICAgICAgICAgICAgIGxhYmVsLnNpemUgPSAwLAogICAgICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKICAgIHhsaW0oLTEuMSwgMS4xKSArCiAgICB5bGltKC0xLjEsIDEuMSkgKwogICAgI2dndGl0bGUoIkNyb3Nzd2FsayBvZiBHRU8sIEZBSVIsIGFuZCBUUlVTVCBwcmluY2lwbGVzIikgKwogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpCmdnc2F2ZShwYXN0ZSgiaW1hZ2VzL2NpcmN1bGFyXyIsInByaW5jaXBsZXMucG5nIiwgc2VwID0gIiIpLCB3aWR0aCA9IDEyLCBoZWlnaHQgPSAxMiwgZHBpID0gNjAwKQoKYGBgClxuZXdwYWdlCkNyb3Nzd2FsayBvZiBHRU8sIEZBSVIsIGFuZCBUUlVTVCBwcmluY2lwbGVzCgohW0Nyb3Nzd2FsayBvZiBHRU8sIEZBSVIsIGFuZCBUUlVTVCBwcmluY2lwbGVzXShpbWFnZXMvY2lyY3VsYXJfcHJpbmNpcGxlcy5wbmcpe3dpZHRoPTZpbn1cIAoKYGBge3IsIGVjaG89RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9Cm15Z3JhcGggPC0gZ2dyYXBoKGdyYXBoKSArCiAgY29vcmRfZml4ZWQoKSArCiAgZ2VvbV9lZGdlX2xpbmswKGFlcyhjb2xvciA9IGxpZmVjeWNsZSksIHdpZHRoID0gLjUpICsKICBnZW9tX25vZGVfcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHNvdXJjZSkpLCBzaXplID0gMSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fbm9kZV9sYWJlbChhZXMobGFiZWwgPSBzaG9ydF9sYWJlbCwgCiAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGFzLmZhY3Rvcihzb3VyY2UpKSwgCiAgICAgICAgICAgICAgICAgIGxhYmVsLnNpemUgPSAwLAogICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgI2dndGl0bGUoIkNyb3Nzd2FsayBvZiBHRU8sIEZBSVIsIGFuZCBUUlVTVCBwcmluY2lwbGVzIikgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGZhY2UgPSAiYm9sZCIpKQpnZ3NhdmUocGFzdGUoImltYWdlcy9hdXRvXyIsInByaW5jaXBsZXMucG5nIiwgc2VwID0gIiIpLCB3aWR0aCA9IDE4LCBoZWlnaHQgPSAxOCwgZHBpID0gNjAwKQpgYGAKCiFbQ3Jvc3N3YWxrIG9mIEdFTywgRkFJUiwgYW5kIFRSVVNUIHByaW5jaXBsZXMgaW4gbmV0d29yayBmb3JtXShpbWFnZXMvYXV0b19wcmluY2lwbGVzLnBuZyl7d2lkdGg9NmlufVwgCgoKXG5ld3BhZ2UKIyMgTmV4dCBTdGVwcwoKV2hpbGUgdGhlIGN1cnJlbnQgc3ByZWFkc2hlZXQgcHJvdmlkZXMgYSB1c2VmdWwgaW5pdGlhbCBwbGF0Zm9ybSBmb3IgY2FwdHVyaW5nIGFuZCBzaGFyaW5nIHRoZSBpbml0aWFsIG1hcHBpbmdzLCBpdCBkb2VzIG5vdCBwcm92aWRlIGEgc2NhbGFibGUgZGF0YSBzdHJ1Y3R1cmUgdGhhdCB3aWxsIGVuYWJsZSBzdHJlYW1saW5lZCBjb2xsZWN0aW9uIG9mIGRhdGEgZnJvbSBtdWx0aXBsZSBjb250cmlidXRvcnMsIGFsbG93aW5nIGZvciBjcm9zcy12YWxpZGF0aW9uIG9mIGlkZW50aWZpZWQgY29ubmVjdGlvbnMuIE5leHQgc3RlcHMgZm9yIHdvcmsgb24gdGhpcyBwcm9qZWN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZzoKCiogVHJhbnNpdGlvbmluZyB0byBhIGRhdGEgbW9kZWwgdGhhdCB3aWxsIGVuYWJsZSBjYXB0dXJlIGFuZCBtYW5hZ2VtZW50IG9mIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gZnJvbSBtdWx0aXBsZSBjb250cmlidXRvcnMgLSBlbmFibGluZyBjcm9zcyB2YWxpZGF0aW9uIG9mIGlkZW50aWZpZWQgY29ubmVjdGlvbnMuCiogRXhwYW5zaW9uIG9mIHRoZSBkYXRhIG1vZGVsIHRvIGNhcHR1cmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5hdHVyZSBvZiB0aGUgY29ubmVjdGlvbnMKKiBEZXZlbG9wIGFuIG9ubGluZSBkYXNoYm9hcmQgdGhhdCBwcm92aWRlcyBjdXJyZW50IGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gYmFzZWQgdXBvbiBjb21tdW5pdHkgY29udHJpYnV0ZWQgZGF0YQoqIFB1Ymxpc2ggdGhlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzIGluIG9uZSBvciBtb3JlIEVhcnRoIFNjaWVuY2UgZGF0YSBwdWJsaWNhdGlvbiB2ZW51ZXMKCgojIyBBcHBlbmRpeCBBIC0gUmVmZXJlbmNlIEluZm9ybWF0aW9uIGZvciB0aGUgRGF0YSBTaGFyaW5nIGFuZCBEYXRhIE1hbmFnZW1lbnQgUHJpbmNpcGxlcwoKYGBge3IsIGVjaG89RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9Cm5fYWxsW2MoMyldICU+JSAKICBxZmxleHRhYmxlKCkgJT4lIAogIHNldF9oZWFkZXJfbGFiZWxzKAogICAgdmFsdWVzID0gbGlzdChub2RlX2xhYmVsID0gIkxpZmVjeWNsZS9QcmluY2lwbGUgbGFiZWwgYW5kIERlc2NyaXB0aW9uIikpICU+JSAKICBmb250c2l6ZShzaXplID0gNywgcGFydCA9ICJib2R5IikgJT4lIAogIGZpdF90b193aWR0aChtYXhfd2lkdGggPSA2LjUsIHVuaXQgPSAiaW4iKQpgYGAK